package com.sample.snl.frontend.LexicalAnalysis;

public class StartState extends State {
    Automaton automaton;

    public StartState(Automaton a) {
        this.automaton = a;
    }

    @Override
    void HandleCharacter(int ch) {
        if (automaton.isAlphabetic(ch)) {
            automaton.setState(automaton.InIdState);
        } else if (automaton.isDigit(ch)) {
            automaton.setState(automaton.InNumState);
        }
        else if (automaton.isBlank(ch)) {
            automaton.stringBuilder.deleteCharAt(automaton.stringBuilder.length() - 1);
            automaton.setState(automaton.StartState);
        } else if (ch == '+') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.PLUS, automaton.stringBuilder.toString());
            ////LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '-') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.MINUS, automaton.stringBuilder.toString());
            ////LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '*') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.TIMES, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '/') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.OVER, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '(') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.LPAREN, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == ')') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.RPAREN, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '[') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.LMIDPAREN, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == ']') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.RMIDPAREN, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == ';') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.SEMI, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == ',') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.COMMA, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '=') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.EQ, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        } else if (ch == '<') {
            automaton.token = new Token(LexicalAnalyser.line, LexicalAnalyser.column, TokenType.LT, automaton.stringBuilder.toString());
            //LexicalAnalyser.LOG.debug("Recognized Token:" + automaton.token);
            automaton.gotToken = true;
        }
        else if (ch == ':') {
            automaton.setState(automaton.InAssignState);
        } else if (ch == '{') {
            automaton.stringBuilder.deleteCharAt(automaton.stringBuilder.length() - 1);
            automaton.setState(automaton.InCommentState);
        } else if (ch == '.') {
            automaton.setState(automaton.InDotState);
        } else if (ch == '\'') {
            automaton.stringBuilder.deleteCharAt(automaton.stringBuilder.length() - 1);
            automaton.setState(automaton.InCharState);
        } else {
            //LexicalAnalyser.LOG.trace("[Error] Unexpected character:{}({})", (char) ch, ch);
            automaton.setState(automaton.ErrorState);
        }
    }
}
